package com.javaex.book.utils;

import java.util.Map;

/**
 * 日志格式化工具
 *
 * @author 黄星琦
 * @Date 2022年3月2日
 */
public class LoggerUtils {
	
	private static final String CAUSE_CAPTION = "Caused by: ";
    private static final String SUPPRESSED_CAPTION = "Suppressed: ";
	
	/**
	 * 格式化异常信息，只打印以指定包名为前缀的堆栈信息
	 * @param e 异常
	 * @param packagePrefix 包前缀
	 * @return 堆栈信息
	 */
	public static String format(Exception e, String packagePrefix) {
		StringBuilder s = new StringBuilder().append(e);
		for (StackTraceElement traceElement : e.getStackTrace()) {
			if (!traceElement.getClassName().startsWith(packagePrefix)) {
				continue;
			}
			s.append("\n\tat ").append(traceElement);
		}
		for (Throwable se : e.getSuppressed()) {
			s.append("\n").append(SUPPRESSED_CAPTION).append(format((Exception) se, packagePrefix));
		}
		Throwable ourCause = e.getCause();
		if (ourCause != null) {
			s.append("\n").append(CAUSE_CAPTION).append(format((Exception) ourCause, packagePrefix));
		}
		return s.toString();
	}
	
	/**
	 * 将Map转为字符串，用于日志打印
	 * 
	 * @param map 要格式化的Map
	 * @return 格式化后的字符串
	 */
	public static <K, V> String mapToString(Map<K, V> map) {
		StringBuffer buffer = new StringBuffer("[");
		for (Map.Entry<K, V> entry : map.entrySet()) {
			buffer.append("\n\t")
				.append(entry.getKey().toString())
				.append(" : ")
				.append(entry.getValue().toString());
		}
		buffer.append("\n]");
		return buffer.toString();
	}
}
